/*
 * Copyright (c) 2021 Talkweb Co., Ltd.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
#ifndef _TW_NFC_NDEF_H
#define _TW_NFC_NDEF_H
#include "tw_nfc_adapt.h"

#define NFC_TLV_HEAD 0x03
#define NDEF_RECORD_SIZE 256

// NDEF NTF类型
typedef enum{
    TNF_NULL = 0,        // 空
    TNF_INSIDE_RTD = 1,  // NFC 论坛知名类型，包括UTF8、ASCII、URI...
    TNF_RFC2406 = 2,     // 定义于RFC 2046[RFC 2046]的媒体类型
    TNF_RFC3986 = 3,     // 定义于 RFC 3986[RFC 3986]的绝对 URI
    TNF_OUTSIDE_RTD = 4, // NFC 论坛外部自定义类型
    TNF_UNKNOW = 5,      // 未知
    TNF_STATIC = 6,      // 不可更改（参考2.3.3节）
    TNF_DEFAULT = 7      // 保留
} TnfType;

// NDEF TNF_INSIDE_RTD类型
typedef enum{
    RTD_UTF8 = 'T', // UTF8类型
    RTD_URI = 'U',  // URI类型
} RtdType;

typedef enum{
    START_PACK,     // 分包开始包
    MIDDLE_PACK,    // 分包中间包
    END_PACK,       // 分包结束包
    START_END_PACK  // 不分包，开始包也是结束包
}PackType;

// NDEF URI
typedef enum{
    RTD_URI_freeForm,     // 0x00     No prepending is done ... the entire URI is
                          // contained in the URI Field
    RTD_URI_httpWWW,      // 0x01     http://www.
    RTD_URI_httpsWWW,     // 0x02     https://www.
    RTD_URI_http,         // 0x03     http://
    RTD_URI_https,        // 0x04     https://
    RTD_URI_tel,          // 0x05     tel:
    RTD_URI_mailto,       // 0x06     mailto:
    RTD_URI_ftpAnonymous, // 0x07     ftp://anonymous:anonymous@
    RTD_URI_ftpFtp,       // 0x08     ftp://ftp.
    RTD_URI_ftps,         // 0x09     ftps://
    RTD_URI_sftp,         // 0x0A     sftp://
    RTD_URI_smb,          // 0x0B     smb://
    RTD_URI_nfs,          // 0x0C     nfs://
    RTD_URI_ftp,          // 0x0D     ftp://
    RTD_URI_dav,          // 0x0E     dav://
    RTD_URI_news,         // 0x0F     news:
    RTD_URI_telnet,       // 0x10     telnet://
    RTD_URI_imap,         // 0x11     imap:
    RTD_URI_rtps,         // 0x12     rtsp://
    RTD_URI_urn,          // 0x13     urn:
} UriVal;

// NDEF首字节解码
typedef struct{
    unsigned char TNF : 3; // TNF标志是 3-bit 字段，指示TYPE字段值的结构
    unsigned char IL : 1;  // IL 标志是 1-bit 字段，置 1 表示在首部存在一个单字节ID_LENGTH字段
    unsigned char SR : 1;  // SR 标志是 1-bit 字段，置 1 表示PAYLOAD_LENGTH字段为单字节
    unsigned char CF : 1;  // CF 标志是 1-bit 字段，置 1 表示 NDEF 消息分块传输
    unsigned char ME : 1;  // ME 标志是 1-bit 字段，置 1 表示 NDEF 消息的结束
    unsigned char MB : 1;  // MB 标志是 1-bit 字段，置 1 表示 NDEF 消息的开始
} NdefHead;

// NDEF参数结构体
typedef struct{
    PackType packtype;
    RtdType dataType;
    UriVal uriVal;
    unsigned char payloadLen;
    unsigned char payload[NDEF_RECORD_SIZE]; 
} NdefFrame;

// 普通内存数据结构体
typedef struct{
    int len;
    unsigned char data[NDEF_RECORD_SIZE + 4];
} MemFrame;

// NDEF格式链表，用于NDEF标签解码
typedef struct NdefList{
   struct NdefList *next; 
    NdefFrame ndef;
}NdefParsingList;

/**
 * @brief NDEF包制作函数
 * @param ndef 传入NDEF相关参数
 * @param mem 保存根据NDEF参数制作的NDEF数据
 * @return 返回TRUE表示NDEF数据制作成功
 */
BOOL TWNdefPackMake(NdefFrame *ndef, MemFrame *mem);

/**
 * @brief NDEF包解析函数
 * @param ndef 保存解析后的NDEF相关参数
 * @param mem 被解析的NDEF数据
 * @return 返回TRUE表示NDEF数据解析成功
 */
BOOL TWNdefPackParsing(NdefFrame *ndef, unsigned char *mem);

#endif
